const express = require('express');
const qs = require('qs');
const querystring = require('querystring');
const app = express();
function json() {
    return function (req, res, next) {
        //获取客户端发送过来的请求体的类型
        const contentType = req.headers['content-type'];
        //如果内容类型不是json的话,直接执行下一个中间件
        if (contentType !== 'application/json') {
            return next();
        }
        //如果请求体的类型是json的话
        //定义一个 buffers空数组,存放客户端发送给服务器的数据
        let buffers = [];
        //监听客户端发送的请求数据,因为客户端请求数据可能比较大,所以分块发送
        //客户端每向服务器发送一段数据,就会触发一次data事件,在回调里可以获取到发送的数据
        req.on('data', (data) => {
            //把每一段的数据保存在buffers数组里
            buffers.push(data);
        });
        //当客户端发送完毕后,会触发end事件
        req.on('end', () => {
            //把Buffer数组合并成一个大的Buffer对象
            const buffer = Buffer.concat(buffers);
            //把Buffer转成字符串
            let body = buffer.toString();
            //把字符串转成JSON对象
            req.body = JSON.parse(body);
            next();
        });
    }
}
/**
 * The extended option allows to choose between parsing the URL-encoded data
   with the querystring library (when `false`) or the qs library (when `true`).
 */
function urlencoded({extended}) {
    return function (req, res, next) {
        //获取客户端发送过来的请求体的类型
        const contentType = req.headers['content-type'];
        //如果内容类型不是json的话,直接执行下一个中间件
        if (contentType !== 'application/x-www-form-urlencoded') {
            return next();
        }
        //如果请求体的类型是json的话
        //定义一个 buffers空数组,存放客户端发送给服务器的数据
        let buffers = [];
        //监听客户端发送的请求数据,因为客户端请求数据可能比较大,所以分块发送
        //客户端每向服务器发送一段数据,就会触发一次data事件,在回调里可以获取到发送的数据
        req.on('data', (data) => {
            //把每一段的数据保存在buffers数组里
            buffers.push(data);
        });
        //当客户端发送完毕后,会触发end事件
        req.on('end', () => {
            //把Buffer数组合并成一个大的Buffer对象
            const buffer = Buffer.concat(buffers);
            //把Buffer转成字符串
            let body = buffer.toString();
            //把字符串转成JSON对象
            if(extended){
                req.body = qs.parse(body);
            }else{
                req.body = querystring.parse(body);
            }
            next();
        });
    }
}
//使用一个json中间件 ，它负责接收请求体，然后把请求变成一个JSOn对象保存在req.body上
app.use(json());
//这也是一个中间件，可以接收请求体，然后把请求体变成一个JSOn对象保存在req.body上
app.use(express.urlencoded({ extended: true }));
const users = [];
/**
 * 返回用户列表
 */
app.get('/api/user', (req, res) => {
    res.end(JSON.stringify(users));
});
/**
 * 添加用户
 */
app.post('/api/user', (req, res) => {
    //获取请求体对象，得到是一个JSON对象
    let user = req.body;
    console.log('user', user);
    //给新添加的用户添加ID属性
    user.id = users.length;
    //把此新用户添加数组里
    users.push(user);
    //返回数组
    res.end(JSON.stringify(users));
});
app.listen(3000, () => console.log('server started on 3000'));